iT邦幫忙

2022 iThome 鐵人賽

DAY 5
1
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 5

DAY 5 Go 語言 算符 (operators) 及零值 (zero values) 的介紹

  • 分享至 

  • xImage
  •  

昨天我們介紹了在 Go 語言中各種變數宣告與更改變數值的方式,但我們有了變數之後,會需要對變數做一些操作,於是乎這就是算符 (operators) 出場的好時機啦!

算符 (operators) 是什麼?

算符是在執行程式時,需要將資料做比較或是數學邏輯運算時會用到的東西,最簡單的例子就是:加、減、乘、除或是比較兩者的大小等等。

Go 語言中 算符 (operators) 的種類

Go 語言中 算符分為以上六種,接下來我就一一簡單介紹各種算符吧!

1.算數算符 (arithmetic operators)

算數算符是我們最熟悉常見的四則運算,以下列出最常遇到的算符符號所代表的意義。

符號 解釋
+ 相加
- 相減
* 相乘
/ 相除
% 餘數
+= =左數加右數
-= =左數減右數
++ 遞增加一
-- 遞減減一

2. 比較算符 (comparison operators)

也有人稱為 關係運算符,用來比較兩個值,看兩者是否相等或是誰大誰小。

符號 解釋
== 檢查兩個值是否相等,回傳 True . False
!= 檢查兩個值是否不相等,回傳 True . False
> 檢查左邊值是否大於右邊值,回傳 True . False
< 檢查左邊值是否小於右邊值,回傳 True . False
>= 檢查左邊值是否大於或等於右邊值,回傳 True . False
<= 檢查左邊值是否小於或等於右邊值,回傳 True . False

3. 邏輯算符(logical operators)

判斷兩個布林值是否皆為真或是其一為真以及反轉布林值的值。

符號 解釋
&& AND 兩者皆須為 True
|| OR 兩者其一為 True
! 反轉布林值,若為 True ,則變成 False ,若為 False ,則變成 True

4. 定址算符(address operators)

目前只需要先知道定址算符是專門用來處理指標 (pointers) 的一種算符,後面介紹到指標時,會有詳細的介紹。

5. 位元算符(bitwise operators)

位元算符是對整數的二進位制作操作,現實生活中運用到的機會也比較少見,這邊就不多贅述啦!

6. 受理算符(receive operators)

受理算符是用來對 Go 語言中通道 (Channel) 寫入值或是讀取值時的一種算符,一樣後面章節會有詳細介紹。

以下舉例為算數算符、比較算符、邏輯算符三者最常見的算符舉例:

範例 1:

package main

import (
	"fmt"
)

func main() {

   var apple int = 10
   var peach int = 25

   var total int = 2 * apple + 4 * peach
   fmt.Println("2顆蘋果+3顆桃子=", total )

   total = (total - 10) / 2
   fmt.Println("折抵10元後,2人平分,1個人金額為=", total )

   total += apple // 也可以打成 total = total + apple
   fmt.Println("小明想再多買一顆蘋果=", total )

   appleCount := 2
   appleCount++
   fmt.Println("蘋果本來2顆,小明多買一顆蘋果後變", appleCount )

   if peach > apple { //如果桃子價格大於蘋果價格,則回傳 True ,即可順利執行 function 內函式
    fmt.Println("桃子比蘋果貴")
   }

   if total % 10 == 5 && total > apple + peach {
    fmt.Println("小明購買的桃子數量一定為奇數,且他不只買一顆水果")
   } 
}

範例 1(執行結果):

2顆蘋果+3顆桃子= 120
折抵10元後,2人平分,1個人金額為= 55
小明想再多買一顆蘋果= 65
蘋果本來2顆,小明多買一顆蘋果後變 3
桃子比蘋果貴
小明購買的桃子數量一定為奇數,且他不只買一顆水果

算符這個名字第一次聽到總覺得很困難,但了解過後,可以先將其簡單看待為四則與算以及比值的大小,基本上使用頻率極高,有時甚至連自己在使用都沒發現呢!

零值 (zero values) 是什麼?

剛剛前面有介紹到算符可以比較值的大小,昨天的文章也有介紹到變數各種宣告方法,其中一個就是可以省略初始值的宣告方法,而這時就是 零值(zero values) 出場的好時機啦!

零值 (zero values) 是指該型別的 預設值 或是 空值 ,以下介紹幾個常用型別的零值,及練習印出零值。

型別 零值
bool(布林值) false
int.float32(整數.浮點數) 0
string(字串) "" (空字串)
指標(pointers)、函式(function)、介面(interface)、切片(slice)、通道(channel)及映射表(map) nil

範例 2:

package main

import (
	"fmt"
	"time"
)

func main(){
    var isClicked bool
    fmt.Println("isClicked:",isClicked)

    var apple int 
    fmt.Println("Count:", apple)

    var temperature float32
    fmt.Println("temperature:",temperature)

    var myName string
    fmt.Println("myName:",myName)

    var dateTime time.Time
    fmt.Println("DateTime:" ,dateTime)
    fmt.Printf("DateTime: %#v \n" ,dateTime)
}

範例 2(執行結果):

isClicked: false
Count: 0
temperature: 0
myName: 
DateTime: 0001-01-01 00:00:00 +0000 UTC
DateTime: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC) 

不知道大家看完範例二最後兩行程式碼,有沒有跟我有一樣的疑問 PrintlnPrintf 差別在哪呢? %#v \n 這串亂碼又是什麼? 為什麼兩者執行結果不同呢? 以下來簡單介紹兩者差異

Printf 與 Println 差異

在網路上與書上查都可以看到他們說, fmt.Printf() 是一種格式化輸出、格式化樣板語言, 恩恩恩所以是什麼意思還是不懂
簡單翻譯成 Printf 可以使用一些特殊符號,來將你想印出的值,用符號所代表的方式來顯示,而 Println 則是單純印出值,無法選擇想要呈現的格式。

以下來介紹幾種常見的格式化符號所代表的意思:

符號(就是那串你以為的亂碼) 格式化結果呈現
%v 單純印出值
%+v 印出值+欄位名稱
%#v 印出值+欄位名稱+型別名稱
%T 印出值的型別
%t 印出布林值(true/false)
%d 印出10進位數字
%s 印出字串
%% 印出%符號

補充:
" "雙引號 內可使用跳脫字元 \t \n (翻成白話就是告訴程式,我前面的並不是單純的字串喔!)
``重音符內則保留原始字串(翻成白話就是即便我加上 \n ,也會解析成一般字串)

綜合以上介紹我們再去看看範例 2 有疑問的兩行程式碼:

範例 2-1:

package main

import (
	"fmt"
	"time"
)

func main(){
    //...中間省略
    var dateTime time.Time
    fmt.Println("DateTime:" ,dateTime) // 單純印出零值
    fmt.Printf("DateTime: %#v \n" ,dateTime)  // 印出值+欄位名稱+型別名稱
}

範例 2-1(執行結果):

//...中間省略
DateTime: 0001-01-01 00:00:00 +0000 UTC // 單純印出
DateTime: time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC) 

今天介紹了算符 (operators) 及零值 (zero values) 那明天我們繼續介紹 Go 語言中的 指標(pointers) ,那我們明天見!


上一篇
DAY 4 Go 語言 用短變數宣告變數 (variables) 及更改變數值
下一篇
DAY 6 Go 語言 值與指標 (pointers) 是什麼?
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言